package com.bilibili.mapper;

import com.bilibili.dto.VideoInfoDto;
import com.bilibili.dto.VideoToJedis;
import com.bilibili.entity.*;
import com.bilibili.vo.CommentVo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 和Video相关的操作Mapper
 * @author xiao
 */
public interface VideoMapper {
  /**
   * 获取随机视频
   * @param ids 随机id数组
   * @return
   */
  List<Video> getRandomVideo(@Param("ids") List<Integer> ids);
  /**
   * 通过id获取简易视频信息
   * @return
   * @param id 视频id
   */
  Video getVideoById(Integer id);
  /**
   * 获取所有视频的播放量等数据的
   * @return
   */
  List<VideoToJedis> getAllVideoToJedis();
  /**
   * 用于task中更新数据库的方法
   * @return
   * @param videoToJedis 视频的点击量等数据的实体类
   */
  Integer updateVideoToRedisByid(VideoToJedis videoToJedis);
  /**
   * 用于获取视频弹幕的方法
   * @return
   * @param videoid 视频id
   */
  List<BulletChat> getBulletChatByid(Integer videoid);
  /**
   * 添加弹幕的方法
   * @return
   * @param bulletChat 弹幕
   */
  Integer addBulletChat(BulletChat bulletChat);

  /**
   * 获取所有视频的方法
   * @return
   */
  List<Video> getAllVideo();
  /**
   *
   * @param videoFlag
   * @return
   */

  Boolean addVideoByFlag(VideoFlag videoFlag);

  /**
   * 通过用户id和视频id获取旗帜的方法

   * @return
   */
  VideoFlag getVideoFlag(VideoFlag videoFlag);
  /**
   * 用于判断是否需要进行插入旗帜的方法
   * @return
   */
  Boolean isVideoByFlagExists(VideoFlag videoFlag);
  /**
   * 用于更改点赞的方法;
   * @param videothumbsupflag
   * @return
   */
  Boolean updateVideoByThumbSupFlag(@Param("videothumbsupflag") Integer videothumbsupflag,@Param("videoid")Integer videoid,@Param("userId")Integer userId);

  /**
   *用于更改投币的方法
   * @param videocoinflag
   * @return
   */
  Boolean updateVideoByVideoCoinFlag(@Param("videocoinflag") Integer videocoinflag,@Param("videoid")Integer videoid,@Param("userId")Integer userId);

  /**
   *用于更改收藏的方法
   * @return
   */
  Boolean updateVideoCollectionFlag(@Param("videocollectionflag") Integer videocollectionflag,@Param("videoid")Integer videoid,@Param("userId")Integer userId);

  /**
   * 用于根据id获取当前视频评论的方法
   * @param videoid
   * @return
   */
  List<Comment> getAllCommentByid(@Param("videoid") Integer videoid);

  /**
   * 增加评论的方法返回主键
   * @param comment
   * @return
   */
    Integer addComment(Comment comment);

  /**
   * 添加视频的方法
   * @param video
   * @return
   */
    Integer addVideo(Video video);

  /**
   * 新加视频添加点击量等变量的方法;
   * @param videoToJedis
   * @return
   */
   Integer addVideoToRedis(VideoToJedis videoToJedis);

  /**
   * 通过新增主键值获取点击量等变量的方法
   * @param id
   * @return
   */
    VideoToJedis  getvideoToReidsbyid(@Param("id")Integer id);

  /**
   * 视频投币后更改用户硬币的方法
   * @param coin
   * @param userId
   * @return
   */
  Boolean updatecoin(@Param("coin")Integer coin,@Param("userId")Integer userId);

  /**
   * 判断视频经验表是否存在的方法
   * @param userId
   * @return
   */
  Boolean isVideoExpExists(@Param("userId")Integer userId);

  /**
   * 获取视频经验表的日期方法
   * @param userId
   * @return
   */
 VideoExp  getVideoExpDate(@Param("userId") Integer userId);
  /**
   * 添加视频经验表的方法
   * @param videoExp
   * @return
   */
 Integer addVideoExp(VideoExp videoExp);
  /**
   * 判断是否是今天第一次观看视频更改日期的方法
   * @param videoExp
   * @return
   */
  Boolean UpDateVideoExpByDate(VideoExp videoExp);
  /**
   * 更改投币次数的方法
   * @param videoExp
   * @return
   */
  Boolean UpDateVideoExpByCoin(VideoExp videoExp);

  /**
   * 获取指定数量的最新商品
   *
   * @param limitCount 需要返回的最新商品的数量
   * @return 指定的数量的最新商品列表
   * @Author YM
   */
  List<VideoInfoDto> getNewestVideos(int limitCount);

  /**
   * 根据视频编号列表查询视频信息
   *
   * @param vids 商品id列表
   * @return 指定id列表的视频信息
   * @Author YM
   */
  List<Video> getVideosByIds(@Param("vids") List<Integer> vids);

  /**
   * 获取所有视频的编号
   * @return 所有视频的编号列表
   * @Author YM
   */
  List<Integer> getAllVideosIds();

  /**
   * 根据视频编号列表查询视频信息
   *
   * @param vids 商品id列表
   * @return 指定id列表的视频信息
   * @Author YM
   */
  List<VideoInfoDto> getVideoInfosByIds(@Param("vids") List<Integer> vids);

}
